package cn.iocoder.yudao.module.trade.convert.cart;

import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO;
import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO;
import cn.iocoder.yudao.module.trade.controller.app.cart.vo.AppTradeCartDetailRespVO;
import cn.iocoder.yudao.module.trade.dal.dataobject.cart.TradeCartItemDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

import java.util.Collections;
import java.util.List;

import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;

/**
 * 贸易推车转换
 *
 * @author huangweidong
 * @date 2023/05/09
 */
@Mapper
public interface TradeCartConvert {

    TradeCartConvert INSTANCE = Mappers.getMapper(TradeCartConvert.class);

    /**
     * 构建空应用程序贸易车细节响应VO
     *
     * @return {@code AppTradeCartDetailRespVO}
     */
    default AppTradeCartDetailRespVO buildEmptyAppTradeCartDetailRespVO() {
        return new AppTradeCartDetailRespVO().setItemGroups(Collections.emptyList())
                .setOrder(new AppTradeCartDetailRespVO.Order().setSkuOriginalPrice(0).setSkuPromotionPrice(0)
                        .setOrderPromotionPrice(0).setDeliveryPrice(0).setPayPrice(0));
    }

    /**
     * 转换
     *
     * @param userId    用户id
     * @param cartItems 购物车物品
     * @return {@code PriceCalculateReqDTO}
     */
    default PriceCalculateReqDTO convert(Long userId, List<TradeCartItemDO> cartItems) {
        return new PriceCalculateReqDTO().setUserId(userId)
                .setItems(convertList(cartItems, cartItem -> new PriceCalculateReqDTO.Item().setSkuId(cartItem.getSkuId())
                        .setCount(cartItem.getSelected() ? cartItem.getCount() : 0)));
    }

    // ========== AppTradeCartDetailRespVO 相关 ==========

    /**
     * 转换
     *
     * @param bean bean
     * @return {@code AppTradeCartDetailRespVO.Promotion}
     */
    AppTradeCartDetailRespVO.Promotion convert(PriceCalculateRespDTO.Promotion bean);

    /**
     * 转换
     *
     * @param orderItem 订单项
     * @param cartItem  车项目
     * @return {@code AppTradeCartDetailRespVO.Sku}
     */
    @Mappings({
            @Mapping(source = "cartItem.count", target = "count")
    })
    AppTradeCartDetailRespVO.Sku convert(PriceCalculateRespDTO.OrderItem orderItem, TradeCartItemDO cartItem);

    /**
     * 转换
     *
     * @param bean bean
     * @return {@code AppTradeCartDetailRespVO.Order}
     */
    AppTradeCartDetailRespVO.Order convert(PriceCalculateRespDTO.Order bean);

}
